package main

import (
	"strings"
	"fmt"
)

/*
  解释器模式
  创建一个接口 Expression 和实现了 Expression 接口的实体类。
  定义作为上下文中主要解释器的 TerminalExpression 类。
  其他的类 OrExpression、AndExpression 用于创建组合式表达式。
*/

type  Expression interface {
    Interpret(cxt string) bool
}

type  TerminalExpression struct {
	data string
}

func (t *TerminalExpression) Interpret(cxt string) bool {
	if strings.Contains(cxt,t.data){
		return true
	}
	return false
}

// or
type  OrExpression struct {
	expr1 Expression
	expr2 Expression
}

func (o *OrExpression) Interpret(cxt string) bool {
	return o.expr1.Interpret(cxt) || o.expr2.Interpret(cxt)
}

// and
type  AndExpression struct {
	expr1 Expression
	expr2 Expression
}

func (o *AndExpression) Interpret(cxt string) bool {
	return o.expr1.Interpret(cxt) && o.expr2.Interpret(cxt)
}


func main() {
	//规则：Robert 和 John 是男性
	robert :=  &TerminalExpression{"Robert"}
	john :=  &TerminalExpression{"John"}
	isMale := OrExpression{robert, john}
	//规则：Julie 是一个未婚的女性，Married 是一个已婚的女性
	julie :=  &TerminalExpression{"Julie"}
	married :=  &TerminalExpression{"Married"}
	isMarriedWoman := AndExpression{julie, married}

	fmt.Println("John is male? ",isMale.Interpret("John Robert"))
	fmt.Println("Julie is a married women?",isMarriedWoman.Interpret("Married"))
}
